]> git.r.bdr.sh - rbdr/super-polarity/blobdiff - Super Polarity/Actors/Ship.cs
Merge branch 'master' of github.com:benbeltran/super-polarity
[rbdr/super-polarity] / Super Polarity / Actors / Ship.cs
diff --git a/Super Polarity/Actors/Ship.cs b/Super Polarity/Actors/Ship.cs
new file mode 100644 (file)
index 0000000..229f639
--- /dev/null
@@ -0,0 +1,92 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Microsoft.Xna.Framework;
+using Microsoft.Xna.Framework.Graphics;
+
+namespace SuperPolarity
+{
+    class Ship : Actor
+    {
+        public enum Polarity : byte { Negative, Positive, Neutral };
+
+        public Polarity CurrentPolarity;
+        public uint MagneticRadius;
+
+        public float FleeVelocity;
+        public float ActVelocity;
+        public float ChargeVelocity;
+        public int RepelRadius;
+
+        protected bool Magnetizing;
+
+        public Ship(SuperPolarity newGame) : base(newGame) {
+            MagneticRadius = 250;
+            RepelRadius = 100;
+
+            HP = 2;
+
+            FleeVelocity = 5;
+            ActVelocity = 1;
+            ChargeVelocity = 2.5f;
+            CurrentPolarity = Polarity.Neutral;
+            Magnetizing = false;
+        }
+
+        public virtual void SwitchPolarity()
+        {
+            if (CurrentPolarity == Polarity.Positive)
+            {
+                CurrentPolarity = Polarity.Negative;
+            }
+            else
+            {
+                CurrentPolarity = Polarity.Positive;
+            }
+        }
+
+        public virtual void SetPolarity(Polarity newPolarity)
+        {
+            CurrentPolarity = newPolarity;
+        }
+
+        public virtual void Shoot()
+        {
+        }
+
+        public override void Update(GameTime gameTime)
+        {
+            base.Update(gameTime);
+            Magnetizing = false;
+        }
+
+        public virtual void Magnetize(Ship ship, float distance, float angle)
+        {
+            Magnetizing = true;
+            Polarity polarity = ship.CurrentPolarity;
+
+            if (polarity != CurrentPolarity)
+            {
+                Attract(angle);
+            }
+            else
+            {
+                Repel(distance, angle);
+            }
+        }
+
+        protected void Attract(float angle)
+        {
+            Velocity.X = (float) (ChargeVelocity * Math.Cos(angle));
+            Velocity.Y = (float) (ChargeVelocity * Math.Sin(angle));
+        }
+
+        protected void Repel(float distance, float angle)
+        {
+            if (distance > RepelRadius) { Magnetizing = false; return; }
+            Velocity.X = -(float)(FleeVelocity * Math.Cos(angle));
+            Velocity.Y = -(float)(FleeVelocity * Math.Sin(angle));
+        }
+    }
+}